#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>

int main() {
    // 创建套接字，用于和服务端通信
    //  int socket(int domain, int type, int protocol);
    int cfd = socket(AF_INET, SOCK_STREAM, 0);
    if (cfd < 0) {
        perror("socker err:");
        return  -1;
    }

    // 链接服务器
    struct sockaddr_in serv;

    serv.sin_family = AF_INET;
    serv.sin_port = htons(10086);

    // int inet_pton(int af, const char *src, void *dst);
    // 再客户端，绑定的是 服务器的 IP 和 端口
    inet_pton(AF_INET, "192.168.1.7", &serv.sin_addr.s_addr);

    printf("[%x]\n", serv.sin_addr.s_addr);

    // int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    int ret = connect(cfd, (struct sockaddr*)&serv, sizeof(serv));
    if (ret < 0) {
        perror("connect err: ");
        return  -2;
    }

    // 和服务端通信
    char buf[1024];
    int len;
    while (1) {
        memset(buf, 0, sizeof(buf));
        //ssize_t read(int fd, void *buf, size_t count);
        //ssize_t write(int fd, const void *buf, size_t count);

        // 从标准输入得到数据
        len = read(STDIN_FILENO, buf, sizeof(buf));
        // 发送
        write(cfd, buf, len);


        // 从服务端读数据
        memset(buf, 0, sizeof(buf));
        len = read(cfd, buf, sizeof(buf));
        if (len <= 0) {
            printf("没有数据或者服务端关闭, len = [%d]\n", len);
            break;
        }

        printf("len = [%d], buf = [%s]\n", len, buf);
    }

    close(cfd);

    return 0;
}
